MapStruct একটি জনপ্রিয় Java annotation processor যা compile-time এ কোড জেনারেট করে। এটি সাধারণত model mapping বা object mapping জন্য ব্যবহৃত হয়, যেখানে আপনি একটি অবজেক্টের ডেটা অন্য একটি অবজেক্টে ট্রান্সফার করতে চান। তবে, কিছু ক্ষেত্রে custom conversion প্রক্রিয়ার প্রয়োজন হয়, যেমন String to Date, Date to String, এবং Custom Object to Another Custom Object ম্যাপিং।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে MapStruct ব্যবহার করে String, Date, এবং Custom Object এর মধ্যে কনভার্সন করা যায়।
১. String এবং Date এর মধ্যে Conversion
একটি সাধারণ কনভার্সন যা অনেকসময় প্রয়োজন হয় তা হলো String থেকে Date এবং Date থেকে String কনভার্সন। এর জন্য MapStruct কাস্টম মেথড ব্যবহার করে কনভার্সন কার্য সম্পন্ন করতে সহায়তা করে।
উদাহরণ: String to Date Conversion
ধরা যাক, আমাদের একটি String আছে যেটি একটি নির্দিষ্ট ফরম্যাটে আছে এবং আমরা সেটি Date অবজেক্টে কনভার্ট করতে চাই।
Custom Mapper Interface:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.text.SimpleDateFormat;
import java.util.Date;
@Mapper
public interface CustomMapper {
CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
// String to Date conversion
@Mapping(target = "dateOfBirth", expression = "java(stringToDate(person.getDateOfBirth()))")
PersonDTO personToPersonDTO(Person person);
// String to Date conversion method
default Date stringToDate(String date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(date);
} catch (Exception e) {
return null;
}
}
}
এখানে, stringToDate মেথডটি String কে Date এ কনভার্ট করছে। MapStruct এর মাধ্যমে personToPersonDTO মেথডে String ফিল্ডের মান Date এ কনভার্ট হয়ে যাবে।
Person.java (Source Object):
public class Person {
private String name;
private String dateOfBirth; // yyyy-MM-dd
// Getters and Setters
}
PersonDTO.java (Target Object):
public class PersonDTO {
private String name;
private Date dateOfBirth;
// Getters and Setters
}
Conversion Output:
MapStruct এর মাধ্যমে এই ম্যাপিং সম্পন্ন হলে, dateOfBirth ফিল্ডটি String থেকে Date এ কনভার্ট হবে।
২. Date to String Conversion
আমরা পূর্বের উদাহরণে String to Date কনভার্ট করেছি, তবে অনেক সময় প্রয়োজন হয় Date কে String এ কনভার্ট করার। এটি করার জন্যও আপনি MapStruct এর মাধ্যমে কাস্টম কনভার্সন মেথড তৈরি করতে পারেন।
উদাহরণ: Date to String Conversion
Custom Mapper Interface:
@Mapper
public interface CustomMapper {
CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
@Mapping(target = "dateOfBirth", expression = "java(dateToString(personDTO.getDateOfBirth()))")
PersonDTO personToPersonDTO(Person person);
// Date to String conversion method
default String dateToString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
}
এখানে, dateToString মেথডটি Date কে String এ কনভার্ট করে, এবং MapStruct এটি স্বয়ংক্রিয়ভাবে ম্যাপিংয়ের সময় ব্যবহার করবে।
Person.java (Source Object):
public class Person {
private String name;
private Date dateOfBirth;
// Getters and Setters
}
PersonDTO.java (Target Object):
public class PersonDTO {
private String name;
private String dateOfBirth; // yyyy-MM-dd
// Getters and Setters
}
Conversion Output:
এখানে dateOfBirth ফিল্ডটি Date থেকে String এ কনভার্ট হয়ে যাবে।
৩. Custom Object এর মধ্যে Conversion
MapStruct কাস্টম অবজেক্টের মধ্যে ম্যাপিং করার জন্য কাস্টম কনভার্সন মেথড ব্যবহার করতে দেয়। অনেক সময় আপনার নিজের তৈরি করা অবজেক্টের মধ্যে কনভার্সন প্রয়োজন হতে পারে, যেখানে ডেটা কাস্টম ফরম্যাটে থাকতে পারে।
উদাহরণ: Custom Object Mapping
ধরা যাক, আমাদের একটি Person অবজেক্ট আছে এবং আমরা সেটিকে একটি PersonDTO তে ম্যাপ করতে চাই, যেখানে address এবং contact ফিল্ডের কাস্টম ম্যাপিং প্রয়োজন।
Person.java (Source Object):
public class Person {
private String name;
private Address address;
private Contact contact;
// Getters and Setters
}
Address.java (Custom Object):
public class Address {
private String city;
private String state;
// Getters and Setters
}
Contact.java (Custom Object):
public class Contact {
private String phone;
private String email;
// Getters and Setters
}
PersonDTO.java (Target Object):
public class PersonDTO {
private String name;
private String address;
private String contactDetails;
// Getters and Setters
}
CustomMapper.java (Custom Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CustomMapper {
CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
@Mapping(target = "address", expression = "java(mapAddressToString(person.getAddress()))")
@Mapping(target = "contactDetails", expression = "java(mapContactToString(person.getContact()))")
PersonDTO personToPersonDTO(Person person);
// Address to String conversion
default String mapAddressToString(Address address) {
return address.getCity() + ", " + address.getState();
}
// Contact to String conversion
default String mapContactToString(Contact contact) {
return contact.getPhone() + ", " + contact.getEmail();
}
}
এখানে:
- mapAddressToString:
Addressঅবজেক্টের ফিল্ডগুলিকে একটি String এ কনভার্ট করছে। - mapContactToString:
Contactঅবজেক্টের ফিল্ডগুলিকে একটি String এ কনভার্ট করছে।
Conversion Output:
এই কাস্টম ম্যাপিংয়ের মাধ্যমে, Person অবজেক্টের address এবং contact ফিল্ডের মান কাস্টম কনভার্ট হয়ে PersonDTO তে String হিসেবে আসবে।
৪. Null Handling in Conversion
MapStruct আপনাকে null মানগুলির জন্য কাস্টম লজিক যোগ করার সুবিধা দেয়। আপনি null check কাস্টম মেথডে অন্তর্ভুক্ত করতে পারেন যাতে অ্যাপ্লিকেশনে null pointer exceptions প্রতিরোধ করা যায়।
Example with Null Check
@Mapper
public interface CustomMapper {
CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
@Mapping(target = "address", expression = "java(mapAddressToString(person.getAddress()))")
PersonDTO personToPersonDTO(Person person);
// Null check with custom mapping
default String mapAddressToString(Address address) {
if (address == null) {
return "Unknown Address";
}
return address.getCity() + ", " + address.getState();
}
}
এখানে, mapAddressToString মেথডটি null চেক করেছে এবং যদি Address অবজেক্টটি null হয় তবে "Unknown Address" রিটার্ন করবে।
সারাংশ
MapStruct ব্যবহার করে String, Date, এবং Custom Object এর মধ্যে কনভার্সন খুবই সহজ। এটি কাস্টম কনভার্সন লজিক যোগ করার জন্য কাস্টম ম্যাপিং মেথডের সুবিধা প্রদান করে, এবং null হ্যান্ডলিং সহ এটি আপনার কোডের কার্যকারিতা এবং স্থায়িত্ব বৃদ্ধি করে। MapStruct আপনাকে compile-time কোড জেনারেশন সুবিধা প্রদান করে, যা আপনার অ্যাপ্লিকেশন পারফরম্যান্সে ইতিবাচক প্রভাব ফেলে।
Read more